#ifndef __M_LOOPTHREADPOOL_H__
#define __M_LOOPTHREADPOOL_H__

#pragma once

#include "eventLoop.hpp"
#include "loopThread.hpp"

class LoopThreadPool
{
private:
    int _thread_count;
    int _next_id;//作为_loops的下标 在创建新的Connection对象时 将对应的loop对象指针传入Connection构造函数
    EventLoop* _baseloop;//当count为0时 说明没有从属线程 那么主线程对应的loop对象将负责所有连接的事件监控和管理
    std::vector<LoopThread*> _threads;
    std::vector<EventLoop*> _loops;//当count大于0时 说明存在从属线程 主线程loop将负责监听连接的事件监控和管理 从线程loop将负责通信连接的事件监控和管理

public:
    LoopThreadPool(EventLoop* baseloop)
    : _thread_count(0),
      _next_id(0),
      _baseloop(baseloop)
    {}

    void setThreadCount(int count) { _thread_count = count; }

    EventLoop* getNextLoop()
    {
        if (_thread_count == 0)
            return _baseloop;
        _next_id = (_next_id + 1) % _thread_count;//0-(_thread_count - 1)之间变化
        return _loops[_next_id];
    }

    void create()//创建从属线程 也就是LoopThread对象 构造完成后 会调用线程入口函数 创建loop对象后启动事件监控 也就是说创建线程就相当于启动事件监控
    {
        if (_thread_count > 0)//设置了从属线程数量 需要创建从属线程
        {
            _threads.resize(_thread_count);//不用push_back而用resize可以节省一定的空间 按需开辟空间
            _loops.resize(_thread_count);
            for (int i = 0; i < _thread_count; i++)
            {
                _threads[i] = new LoopThread;
                //LoopThread的线程入口函数中 也就是在从线程中会创建loop对象 当从线程还未完成loop对象的创建时 主线程会在getLoop时阻塞 直到创建完成
                _loops[i] = _threads[i]->getLoop();
            }
        }
    }
};

#endif
